package com.zkt.subject.application.controller;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.zkt.subject.application.convert.SubjectCategoryDTOConverter;
import com.zkt.subject.application.convert.SubjectLabelDTOConverter;
import com.zkt.subject.application.dto.SubjectCategoryDTO;
import com.zkt.subject.entity.SubjectLabelDTO;
import com.zkt.subject.common.entity.Result;
import com.zkt.subject.domain.entity.SubjectCategoryBO;
import com.zkt.subject.domain.service.SubjectCategoryDomainService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.LinkedList;
import java.util.List;

/**
 * @author 赵开泰
 * @program jc-club
 * @date 2024/9/30
 * @description 题目分类的controller
 **/

@RestController
@RequestMapping("/category")
@Slf4j
public class SubjectCategoryController {
	
	@Resource
	private SubjectCategoryDomainService subjectCategoryDomainService;
	
	/**
	 * 新增分类
	 *
	 * @param subjectCategoryDTO 请求参数
	 * @return 成功与否
	 */
	@PostMapping("add")
	public Result<Boolean> add(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectCategoryController.add.dto:{}", JSON.toJSONString(subjectCategoryDTO));
			}
			
			if (ObjectUtil.isNull(subjectCategoryDTO.getCategoryType())) {
				throw new Exception("分类类型不能为空");
			}
			if (StrUtil.isEmpty(subjectCategoryDTO.getCategoryName())) {
				throw new Exception("分类的名称不能为空");
			}
			if (ObjectUtil.isNull(subjectCategoryDTO.getParentId())) {
				throw new Exception("分类父级id不能为空");
			}
			
			SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE
					.convertDtoToBo(subjectCategoryDTO);
			subjectCategoryDomainService.add(subjectCategoryBO);
			return Result.ok(true);
		} catch (Exception e) {
			log.error("SubjectCategoryController.add.error:{}", e.getMessage(), e);
			return Result.fail(e.getMessage());
		}
	}
	
	/**
	 * 查询分类大类
	 *
	 * @return 分类大类的列表
	 */
	@PostMapping("queryPrimaryCategory")
	public Result<List<SubjectCategoryDTO>> queryPrimaryCategory(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectCategoryController.queryPrimaryCategory.dto:{}", JSON.toJSONString(subjectCategoryDTO));
			}
			
			if (ObjectUtil.isNull(subjectCategoryDTO.getCategoryType())) {
				throw new Exception("分类类型不能为空");
			}
			
			SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.convertDtoToBo(subjectCategoryDTO);
			List<SubjectCategoryBO> subjectCategoryBOList = subjectCategoryDomainService.queryCategory(subjectCategoryBO);
			List<SubjectCategoryDTO> subjectCategoryDTOList = SubjectCategoryDTOConverter.INSTANCE
					.convertBoToDto(subjectCategoryBOList);
			return Result.ok(subjectCategoryDTOList);
		} catch (Exception e) {
			log.error("SubjectCategoryController.queryPrimaryCategory.error:{}", e.getMessage(), e);
			return Result.fail("查询失败");
		}
	}
	
	/**
	 * 查询大类下分类
	 *
	 * @param subjectCategoryDTO 分类大类的数据
	 * @return 该大类下的所有分类
	 */
	@PostMapping("queryCategoryByPrimary")
	public Result<List<SubjectCategoryDTO>> queryCategoryByPrimary(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectCategoryController.queryCategoryByPrimary.dto:{}", JSON.toJSONString(subjectCategoryDTO));
			}
			
			if (ObjectUtil.isNull(subjectCategoryDTO.getParentId())) {
				throw new Exception("分类id不能为空");
			}
			
			SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE
					.convertDtoToBo(subjectCategoryDTO);
			List<SubjectCategoryBO> subjectCategoryBOList = subjectCategoryDomainService.queryCategory(subjectCategoryBO);
			List<SubjectCategoryDTO> subjectCategoryDTOList = SubjectCategoryDTOConverter.INSTANCE
					.convertBoToDto(subjectCategoryBOList);
			return Result.ok(subjectCategoryDTOList);
		} catch (Exception e) {
			log.error("SubjectCategoryController.queryPrimaryCategory.error:{}", e.getMessage(), e);
			return Result.fail("查询失败");
		}
	}
	
	/**
	 * 更新分类
	 *
	 * @param subjectCategoryDTO 请求参数
	 * @return 成功与否
	 */
	@PostMapping("update")
	public Result<Boolean> update(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectCategoryController.update.dto:{}", JSON.toJSONString(subjectCategoryDTO));
			}
			
			SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE
					.convertDtoToBo(subjectCategoryDTO);
			Boolean result = subjectCategoryDomainService.update(subjectCategoryBO);
			return Result.ok(result);
		} catch (Exception e) {
			log.error("SubjectCategoryController.update.error:{}", e.getMessage(), e);
			return Result.fail("更新分类失败");
		}
	}
	
	/**
	 * 删除分类
	 *
	 * @param subjectCategoryDTO 请求参数
	 * @return 成功与否
	 */
	@PostMapping("delete")
	public Result<Boolean> delete(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectCategoryController.delete.dto:{}", JSON.toJSONString(subjectCategoryDTO));
			}
			
			SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE
					.convertDtoToBo(subjectCategoryDTO);
			Boolean result = subjectCategoryDomainService.delete(subjectCategoryBO);
			return Result.ok(result);
		} catch (Exception e) {
			log.error("SubjectCategoryController.delete.error:{}", e.getMessage(), e);
			return Result.fail("删除分类失败");
		}
	}
	
	/**
	 * 查询分类及标签一次性
	 */
	@PostMapping("queryCategoryAndLabel")
	public Result<List<SubjectCategoryDTO>> queryCategoryAndLabel(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectCategoryController.queryCategoryAndLabel.dto:{}", JSON.toJSONString(subjectCategoryDTO));
			}
			
			if (ObjectUtil.isNull(subjectCategoryDTO.getId())) {
				throw new Exception("分类id不能为空");
			}
			
			SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.convertDtoToCategoryBO(subjectCategoryDTO);
			List<SubjectCategoryBO> subjectCategoryBOList = subjectCategoryDomainService.queryCategoryAndLabel(subjectCategoryBO);
			
			return Result.ok(dealCategoryAndLabel(subjectCategoryBOList));
		} catch (Exception e) {
			log.error("SubjectCategoryController.queryPrimaryCategory.error:{}", e.getMessage(), e);
			return Result.fail("查询失败");
		}
	}
	
	private List<SubjectCategoryDTO> dealCategoryAndLabel(List<SubjectCategoryBO> subjectCategoryBOList) {
		List<SubjectCategoryDTO> dtoList = new LinkedList<>();
		subjectCategoryBOList.forEach(bo -> {
			SubjectCategoryDTO dto = SubjectCategoryDTOConverter.INSTANCE.convertBoToCategoryDTO(bo);
			List<SubjectLabelDTO> labelDTOList = SubjectLabelDTOConverter.INSTANCE.convertListBoToLabelDTO(bo.getLabelBOList());
			dto.setLabelDTOList(labelDTOList);
			dtoList.add(dto);
		});
		return dtoList;
	}
	
}